; void call for side-effects.
define void @ctest1_1(i32 %x, i32 %y)
{
        ret void
}
declare void @ctest1_2(i32 %x, i32 %y)

define i32 @call1(i32 %x, i32 %y)
{
          call void @ctest1_1 (i32 %x, i32 %y)
          call void @ctest1_2 (i32 %x, i32 %y)
          ret i32 5
}

; Call as an expression
declare i32 @ctest2_1(i32 %x, i32 %y)

define i32 @ctest2(i32 %x, i32 %y)
{
        %a0 = add i32 %x, %y
        ret i32 %a0
}

define i32 @call2(i32 %x, i32 %y)
{
         %a0 = call i32 @ctest2(i32 %x, i32 %y)
         %a1 = call i32 @ctest2_1(i32 %a0, i32 %y)
         ret i32 %a1
}

; Call with function pointer

define i32 @ctest3(i32 %x)
{
        %a0 = add i32 %x, %x
        ret i32 %a0
}

define i32 @call3(i32 (i32)* %f, i32 %y)
{
         %a0 = call i32 (i32)* %f (i32 %y)
         ret i32 %a0
}

; Invoke
define i32 @invoke1(i32 %x, i32 %y)
{
        invoke void @ctest1_1 (i32 %x, i32 %y)
        to label %next unwind label %fail

        next:
          ret i32 5
        fail:
          ret i32 0
}

; Call a built-in.
declare void @__builtin_memset(i32* %dst, i32 %val, i32 %size);
define void @test(i32* %buff, i32 %sz)
{
      call void @__builtin_memset (i32* %buff, i32 0, i32 %sz)
      ret void
}

